package com.java.gamePackeg;


import com.java.gamePackeg.event.*;

import javax.swing.*;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class XianLiveMain {
    //当前玩家
    private Player player;
    //所有商品
    private static List<Product> proList = new ArrayList<Product>();
    //随机事件
    private static List<Event> eventList = new ArrayList<Event>();
    //市场商品列表
    private List<Product> marketProList = new ArrayList<Product>();
    //当前地址 默认：钟楼
    private Address nowAddress = Address.Chang_Cheng;
    //当前游戏天数
    private int day = 0;
    //最大游戏天数
    private static final int MAX_DAY = 40;
    //利息
    private static final float RATE = 0.1f;

    public void run() {
        String info = "-------------------------------------------------------- 神州浮生 ----------------------------------------------------------\n" +
                "   在本游戏中，您扮演一位在 中国谋生的青年。一开始，您只有6000元钱，并且还欠村长4500元\n" +
                "债务。这些债务每天的利息高达10%.如果不及时还清，村长会叫老乡来扁您，您可能牺牲在   中国的某一个角落街头。\n" +
                "您决定在   各个地方的黑市倒卖各种物品来发财致富，不仅还掉债务，而且要荣登   中国富人排行榜.\n" +
                "您只能在   中国呆" + MAX_DAY + "天，每次从一个黑市奔走到另一个黑市算一天。\n" +
                "   您会在   中国遭遇到各种事件，让您感到   中国浮生之艰难，世态之炎凉，我们这个时代强烈的荒谬感。";
        JOptionPane.showMessageDialog(null, info);

        //初始化游戏
        initGame();
        //显示界面
        viewGame();

    }

    /**
     * 显示游戏界面
     */
    private void viewGame() {
        String info = "------------------ 当前游戏 %2d/%2d天 ----------------------\n" +
                "玩家信息：%s\n" +
                "--- 黑市：%s-----------------------------------------------\n" +
                "%s\n\n" +
                "--- 神州地图 -----------------------------------------------\n" +
                "%s\n\n" +
                "--- 操作：请使用一个空格分隔输入参数 -----------------------------------\n" +
                "0- 逛中国   1- 买入   2- 卖出   3- 还款   4- 退出游戏";
        boolean flag = true;
        while (flag) {
            String input = JOptionPane.showInputDialog(String.format(info, this.day, MAX_DAY, this.player.toString(), this.nowAddress.toString(), getMarketProsInfo(), getMapInfo()));
            //非法过滤 输入格式校验
            if (input == null || input.trim().isEmpty() ||
                    !input.matches("(0 ([1-9]|10)|[1-2] [1-9] [1-9]\\d*|3 [1-9]\\d*|4)")) {
                JOptionPane.showMessageDialog(null, "输入错误，请重新输入。");
                continue;
            }
            //解析输入
            flag = analysisInput(input);
        }
    }

    /**
     * 解析输入
     */
    private boolean analysisInput(String input) {
        boolean flag = true;
        String[] inputs = input.split(" ");
        switch (Integer.parseInt(inputs[0])) {
            case 0:
                flag = changeAddress(Integer.parseInt(inputs[1]));
                break;
            case 1:
                buyPros(inputs);
                break;
            case 2:
                salPros(inputs);
                break;
            case 3:
                reDebt(Integer.parseInt(inputs[1]));
                break;
            default:
                flag = false;
        }
        return flag;
    }

    /**
     * 还款
     */
    private void reDebt(int money) {
        if (this.player.getMoney() < money) {
            JOptionPane.showMessageDialog(null, "这点钱能干啥，赶紧走远点", "错误", JOptionPane.ERROR_MESSAGE);
            return;
        }
        this.player.setMoney(this.player.getMoney() - money);
        this.player.setDebt(this.player.getDebt() - money);
    }

    /**
     * 卖出
     */
    private void salPros(String[] inputs) {
        //卖出商品位置
        int index = Integer.parseInt(inputs[1]) - 1;
        //判断是否超界
        if (index < 0 || index >= this.player.getProList().size()) {
            JOptionPane.showMessageDialog(null, "能不能好好输入", "错误", JOptionPane.ERROR_MESSAGE);
            return;
        }
        //获取卖出商品
        PlayerProduct salPro = this.player.getProList().get(index);
        //判断当前市场是否有此商品
        int marketProIndex = this.marketProList.indexOf(salPro);
        if (marketProIndex == -1) {
            JOptionPane.showMessageDialog(null, "这里没有人需要" + salPro.getName(), "错误", JOptionPane.ERROR_MESSAGE);
            return;
        }
        //市场价格
        int marketPrice = this.marketProList.get(marketProIndex).getNowPrice();
        //卖出数量
        int count = Integer.parseInt(inputs[2]);
        //玩家卖出
        player.salPro(salPro, marketPrice, count);
    }

    /**
     * 买入
     */
    private void buyPros(String[] inputs) {
        //买入商品位置
        int index = Integer.parseInt(inputs[1]) - 1;
        //判断是否超界
        if (index < 0 || index >= this.marketProList.size()) {
            JOptionPane.showMessageDialog(null, "没有这烂怂东西，别耽误我时间", "错误", JOptionPane.ERROR_MESSAGE);
            return;
        }
        //获取购买商品
        Product buyPro = this.marketProList.get(index);
        //买入数量
        int count = Integer.parseInt(inputs[2]);
        //玩家购买货物
        this.player.buyPro(buyPro, count, true);
    }

    /**
     * 切换地址
     */
    private boolean changeAddress(int index) {
        //换算地址角标从0开始
        index--;
        //前一天时，退出游戏
        if (this.day == MAX_DAY - 1) {
            JOptionPane.showMessageDialog(null, "时间到了，你要回家娶媳妇了，你赚了？？？");
            return false;
        }
        //切换同一个地址，操作无效
        if (this.nowAddress == Address.values()[index]) {
            return true;
        }
        //切换当前地址的枚举对象
        this.nowAddress = Address.values()[index];
        //加一天
        this.day++;
        //构建当前黑市商品
        initMarketPros();
        //增加利息
        this.player.setDebt(Math.round(this.player.getDebt() * (1 + RATE)));
        //随机事件
        runRandomEvent();
        return true;
    }

    /**
     * 触发随机事件
     */
    private void runRandomEvent() {
        //获取随机执行的事件
        int index = (int) (Math.random() * eventList.size());
        Event event = eventList.get(index);
        //执行随机事件
        event.event(player, marketProList);
    }

    /**
     * 获取黑市商品信息
     */
    private String getMarketProsInfo() {
        StringBuffer sbuf = new StringBuffer();
        for (int i = 0; i < this.marketProList.size(); i++) {
            if (i != 0 && i % 4 == 0) {
                sbuf.append("\n");
            }
            sbuf.append(i + 1).append("- ").append(this.marketProList.get(i).toString()).append("   ");
        }
        return sbuf.toString();
    }

    /**
     * 获取地图信息
     */
    private String getMapInfo() {
        StringBuffer sbuf = new StringBuffer();

        for (int i = 0; i < Address.values().length; i++) {
            if (i != 0 && i % 5 == 0) {
                sbuf.append("\n");
            }
            sbuf.append(i + 1).append("- ").append(Address.values()[i].toString()).append("   ");
        }
        return sbuf.toString();
    }

    /**
     * 初始化游戏
     */
    private void initGame() {

        initPlayer();

        initPros();

        initMarketPros();

        initRandomEvent();
    }

    /**
     * 初始化随机事件
     */
    private void initRandomEvent() {
        //添加老乡给摇头丸事件
        eventList.add(new FreeProsEvent());
        //添加城管大妈事件
        eventList.add(new CityMgrEvent());

        eventList.add(new GymShoesEvent());
        eventList.add(new LoseProEvent());
//        eventList.add(new )
        eventList.add(new CityMgrEvent());
        eventList.add(new FindDonkeyEvevt());
        eventList.add(new FreeProsEvent());
        eventList.add(new FuPoEvent());
        eventList.add(new LaoTaiTaiEvent());
        eventList.add(new LoseMoneyEvent());
//        eventList.add(new LoseProEvent());
        eventList.add(new Test02Event());
        eventList.add(new ThiefEvent());
    }

    /**
     * 初始化玩家
     */
    private void initPlayer() {
        String playerName = JOptionPane.showInputDialog("请输入你的大名：");
        while (playerName == null || playerName.trim().isEmpty()) {
            playerName = JOptionPane.showInputDialog("请认真输入你的大名：");
        }
        player = new Player(playerName);
    }

    /**
     * 初始化所有商品
     */
    private void initPros() {
        this.proList.add(new Product(1, "盗版DVD", 4, 35));
        this.proList.add(new Product(2, "野生奥特曼", 998, 20000));
        this.proList.add(new Product(3, "小电驴", 500, 3000));
        this.proList.add(new Product(4, "走私汽车", 20000, 100000));
        this.proList.add(new Product(5, "西安小宝贝", 1000, 2000));
        this.proList.add(new Product(6, "盗版手机", 200, 1500));
        this.proList.add(new Product(7, "青花瓷", 100, 5000));
        this.proList.add(new Product(8, "仿真古董", 100, 10000));
        this.proList.add(new Product(9, "小霸王", 30, 1200));
        this.proList.add(new Product(10, "山寨球鞋", 150, 800));
        this.proList.add(new Product(11, "PSP游戏机", 60, 500));
        this.proList.add(new Product(12, "摇头丸", 50, 1500));
    }

    /**
     * 初始化市场商品
     */
    private void initMarketPros() {
        //随机商品个数 4 ~ 7
        int prosCount = (int) (Math.random() * (7 - 4 + 1) + 4);

        Set<Product> marketSet = new HashSet<Product>();
        while (marketSet.size() < prosCount) {
            //随机取某个商品
            int randomIndex = (int) (Math.random() * proList.size());
            Product p = this.proList.get(randomIndex);
            marketSet.add(p);
            //随机市场商品价格
            p.randomNowPrice();
        }
        //清理之前市场的商品
        this.marketProList.clear();
        //将选定的市场商品进行添加到市场list
        this.marketProList.addAll(marketSet);

    }

    public static List<Product> getProList() {
        return proList;
    }

    public static void setProList(List<Product> proList) {
        XianLiveMain.proList = proList;
    }
}
